# Library
library(tidyverse)
library(readxl)
library(janitor)
library(seminr)
library(psych)
library(MVN)PLS-SEM demo: Young peopleβs perceived service quality and environmental performance of hybrid electric bus.
R you ready? Intro to SEM in R.
1 Sample study
- Journal article: Young peopleβs perceived service quality and environmental performance of hybrid electric bus.
- Author: Zial Haque and Tehjeeb Noor
- Article link: DOI link
- Download the dataset here
2 Libraries
3 Data
## data
case_data <- read_csv("data/e_bus_customer_satisfaction.csv") %>%
clean_names()
case_data_items <- case_data %>%
select(bt1:bt7, bd1:bd4, emp1:emp5, cs1:cs3, ep1:ep4, ls1:ls5)4 Exploratory factor analysis
4.1 Scree plot
## Scree plot using parallel analysis
fa.parallel(case_data_items, fa = "fa")Parallel analysis suggests that the number of factors = 6 and the number of components = NA
4.2 Factor extraction
## Factor loading
bus_fa <- fa(r = case_data_items,
nfactors = 6,
rotate = "varimax")
print(bus_fa$loadings, sort = TRUE, cutoff = 0.4)
Loadings:
MR2 MR1 MR3 MR4 MR6 MR5
ls1 0.820
ls2 0.891
ls3 0.828
ls4 0.806
ls5 0.599
bt1 0.673
bt2 0.666
bt4 0.549
bt5 0.680
bt6 0.578
bt7 0.550
ep1 0.864
ep2 0.900
ep3 0.690
ep4 0.705
emp1 0.688
emp2 0.662
emp3 0.636
emp4 0.697
emp5 0.502
bd1 0.679
bd2 0.640
bd3 0.676
bd4 0.629
cs1 0.774
cs2 0.817
cs3 0.768
bt3 0.476
MR2 MR1 MR3 MR4 MR6 MR5
SS loadings 3.477 3.363 3.081 2.658 2.429 2.297
Proportion Var 0.124 0.120 0.110 0.095 0.087 0.082
Cumulative Var 0.124 0.244 0.354 0.449 0.536 0.618
5 Partial-least square SEM
5.1 Specifying the measurement model
pls_mm_ebus <-
constructs(
composite("tangible", multi_items("bt", c(1:2, 5:7))),
composite("drivers_quality", multi_items("bd", 1:4)),
composite("empathy", multi_items("emp", 1:5)),
composite("env_perf", multi_items("ep", 1:4)),
composite("customer_sat", multi_items("cs", 1:3)),
composite("life_sat", multi_items("ls", 1:5))
)
plot(pls_mm_ebus)5.2 Specifying the structural model
pls_sm_ebus <-
relationships(
paths(from = c("tangible", "drivers_quality", "empathy", "env_perf"),
to = "customer_sat"),
paths(from = "customer_sat", to = "life_sat")
)
plot(pls_sm_ebus)5.3 Estimating PLS-SEM model
pls_model_ebus <-
estimate_pls(
data = case_data,
measurement_model = pls_mm_ebus,
structural_model = pls_sm_ebus
)
plot(pls_model_ebus)summary_pls_model_ebus <- summary(pls_model_ebus)
summary_pls_model_ebus
Results from package seminr (2.3.2)
Path Coefficients:
customer_sat life_sat
R^2 0.448 0.077
AdjR^2 0.440 0.074
tangible 0.179 .
drivers_quality 0.146 .
empathy 0.310 .
env_perf 0.237 .
customer_sat . 0.278
Reliability:
alpha rhoC AVE rhoA
tangible 0.830 0.880 0.595 0.831
drivers_quality 0.856 0.902 0.698 0.857
empathy 0.825 0.876 0.586 0.840
env_perf 0.920 0.944 0.808 0.926
customer_sat 0.941 0.962 0.895 0.944
life_sat 0.903 0.929 0.724 0.911
Alpha, rhoC, and rhoA should exceed 0.7 while AVE should exceed 0.5
5.4 Bootstraping PLS-SEM
## bootstrapping PLS-SEM model
boot_pls_model_ebus <- bootstrap_model(seminr_model = pls_model_ebus,
nboot = 1000)
## summary results
summary_boot_pls_model_ebus <- summary(boot_pls_model_ebus, alpha = 0.10)
summary_boot_pls_model_ebus
Results from Bootstrap resamples: 1000
Bootstrapped Structural Paths:
Original Est. Bootstrap Mean Bootstrap SD
tangible -> customer_sat 0.179 0.180 0.062
drivers_quality -> customer_sat 0.146 0.142 0.070
empathy -> customer_sat 0.310 0.313 0.068
env_perf -> customer_sat 0.237 0.238 0.051
customer_sat -> life_sat 0.278 0.289 0.051
T Stat. 5% CI 95% CI
tangible -> customer_sat 2.888 0.082 0.284
drivers_quality -> customer_sat 2.095 0.024 0.258
empathy -> customer_sat 4.588 0.200 0.424
env_perf -> customer_sat 4.635 0.152 0.320
customer_sat -> life_sat 5.418 0.203 0.372
Bootstrapped Weights:
Original Est. Bootstrap Mean Bootstrap SD T Stat.
bt1 -> tangible 0.233 0.234 0.029 8.078
bt2 -> tangible 0.273 0.273 0.027 9.984
bt5 -> tangible 0.265 0.266 0.029 9.079
bt6 -> tangible 0.266 0.265 0.024 10.868
bt7 -> tangible 0.259 0.257 0.024 10.918
bd1 -> drivers_quality 0.294 0.293 0.021 13.906
bd2 -> drivers_quality 0.289 0.289 0.021 13.623
bd3 -> drivers_quality 0.313 0.314 0.023 13.321
bd4 -> drivers_quality 0.301 0.301 0.018 16.538
emp1 -> empathy 0.236 0.236 0.024 9.715
emp2 -> empathy 0.307 0.306 0.027 11.510
emp3 -> empathy 0.185 0.184 0.030 6.223
emp4 -> empathy 0.251 0.251 0.027 9.422
emp5 -> empathy 0.321 0.322 0.029 11.026
ep1 -> env_perf 0.241 0.240 0.018 13.623
ep2 -> env_perf 0.282 0.282 0.013 22.318
ep3 -> env_perf 0.314 0.316 0.027 11.709
ep4 -> env_perf 0.277 0.277 0.027 10.324
cs1 -> customer_sat 0.355 0.355 0.009 39.391
cs2 -> customer_sat 0.369 0.370 0.011 34.191
cs3 -> customer_sat 0.332 0.333 0.010 34.528
ls1 -> life_sat 0.235 0.236 0.031 7.571
ls2 -> life_sat 0.253 0.255 0.030 8.380
ls3 -> life_sat 0.259 0.258 0.031 8.447
ls4 -> life_sat 0.221 0.218 0.038 5.786
ls5 -> life_sat 0.204 0.204 0.052 3.921
5% CI 95% CI
bt1 -> tangible 0.185 0.281
bt2 -> tangible 0.228 0.315
bt5 -> tangible 0.221 0.317
bt6 -> tangible 0.225 0.306
bt7 -> tangible 0.218 0.298
bd1 -> drivers_quality 0.258 0.327
bd2 -> drivers_quality 0.254 0.325
bd3 -> drivers_quality 0.277 0.353
bd4 -> drivers_quality 0.272 0.333
emp1 -> empathy 0.195 0.274
emp2 -> empathy 0.268 0.353
emp3 -> empathy 0.131 0.229
emp4 -> empathy 0.207 0.293
emp5 -> empathy 0.277 0.371
ep1 -> env_perf 0.208 0.267
ep2 -> env_perf 0.261 0.302
ep3 -> env_perf 0.277 0.361
ep4 -> env_perf 0.234 0.322
cs1 -> customer_sat 0.339 0.370
cs2 -> customer_sat 0.353 0.389
cs3 -> customer_sat 0.317 0.348
ls1 -> life_sat 0.188 0.285
ls2 -> life_sat 0.210 0.306
ls3 -> life_sat 0.209 0.306
ls4 -> life_sat 0.154 0.275
ls5 -> life_sat 0.117 0.286
Bootstrapped Loadings:
Original Est. Bootstrap Mean Bootstrap SD T Stat.
bt1 -> tangible 0.763 0.763 0.037 20.586
bt2 -> tangible 0.766 0.765 0.035 21.705
bt5 -> tangible 0.767 0.766 0.032 23.832
bt6 -> tangible 0.790 0.788 0.030 26.288
bt7 -> tangible 0.772 0.770 0.034 22.979
bd1 -> drivers_quality 0.834 0.833 0.022 38.677
bd2 -> drivers_quality 0.823 0.821 0.025 32.829
bd3 -> drivers_quality 0.858 0.858 0.017 51.607
bd4 -> drivers_quality 0.826 0.825 0.027 30.793
emp1 -> empathy 0.768 0.766 0.029 26.148
emp2 -> empathy 0.799 0.797 0.028 28.183
emp3 -> empathy 0.699 0.697 0.046 15.222
emp4 -> empathy 0.794 0.792 0.031 25.308
emp5 -> empathy 0.762 0.763 0.028 27.095
ep1 -> env_perf 0.905 0.903 0.018 49.791
ep2 -> env_perf 0.947 0.946 0.010 98.357
ep3 -> env_perf 0.875 0.875 0.020 44.265
ep4 -> env_perf 0.866 0.865 0.028 30.751
cs1 -> customer_sat 0.944 0.944 0.012 76.924
cs2 -> customer_sat 0.960 0.960 0.006 150.747
cs3 -> customer_sat 0.934 0.933 0.015 63.827
ls1 -> life_sat 0.874 0.873 0.024 36.700
ls2 -> life_sat 0.915 0.915 0.015 59.672
ls3 -> life_sat 0.885 0.884 0.026 33.863
ls4 -> life_sat 0.854 0.851 0.024 35.463
ls5 -> life_sat 0.711 0.709 0.049 14.479
5% CI 95% CI
bt1 -> tangible 0.701 0.820
bt2 -> tangible 0.705 0.819
bt5 -> tangible 0.711 0.815
bt6 -> tangible 0.736 0.834
bt7 -> tangible 0.711 0.822
bd1 -> drivers_quality 0.797 0.866
bd2 -> drivers_quality 0.778 0.859
bd3 -> drivers_quality 0.829 0.883
bd4 -> drivers_quality 0.778 0.865
emp1 -> empathy 0.715 0.811
emp2 -> empathy 0.746 0.840
emp3 -> empathy 0.617 0.762
emp4 -> empathy 0.740 0.841
emp5 -> empathy 0.715 0.806
ep1 -> env_perf 0.869 0.928
ep2 -> env_perf 0.928 0.959
ep3 -> env_perf 0.842 0.905
ep4 -> env_perf 0.812 0.906
cs1 -> customer_sat 0.922 0.961
cs2 -> customer_sat 0.949 0.970
cs3 -> customer_sat 0.907 0.954
ls1 -> life_sat 0.830 0.908
ls2 -> life_sat 0.891 0.938
ls3 -> life_sat 0.836 0.922
ls4 -> life_sat 0.808 0.887
ls5 -> life_sat 0.618 0.782
Bootstrapped HTMT:
Original Est. Bootstrap Mean Bootstrap SD
tangible -> drivers_quality 0.667 0.666 0.063
tangible -> empathy 0.440 0.442 0.068
tangible -> env_perf 0.535 0.536 0.053
tangible -> customer_sat 0.551 0.550 0.058
tangible -> life_sat 0.378 0.384 0.069
drivers_quality -> empathy 0.606 0.606 0.056
drivers_quality -> env_perf 0.470 0.471 0.063
drivers_quality -> customer_sat 0.565 0.564 0.049
drivers_quality -> life_sat 0.279 0.285 0.070
empathy -> env_perf 0.424 0.427 0.056
empathy -> customer_sat 0.596 0.596 0.051
empathy -> life_sat 0.262 0.274 0.070
env_perf -> customer_sat 0.532 0.533 0.048
env_perf -> life_sat 0.320 0.323 0.062
customer_sat -> life_sat 0.300 0.305 0.057
5% CI 95% CI
tangible -> drivers_quality 0.557 0.762
tangible -> empathy 0.324 0.548
tangible -> env_perf 0.447 0.623
tangible -> customer_sat 0.454 0.640
tangible -> life_sat 0.274 0.497
drivers_quality -> empathy 0.511 0.692
drivers_quality -> env_perf 0.367 0.573
drivers_quality -> customer_sat 0.478 0.646
drivers_quality -> life_sat 0.171 0.399
empathy -> env_perf 0.336 0.518
empathy -> customer_sat 0.509 0.674
empathy -> life_sat 0.158 0.386
env_perf -> customer_sat 0.451 0.610
env_perf -> life_sat 0.222 0.422
customer_sat -> life_sat 0.206 0.396
Bootstrapped Total Paths:
Original Est. Bootstrap Mean Bootstrap SD
tangible -> customer_sat 0.179 0.180 0.062
tangible -> life_sat 0.050 0.052 0.021
drivers_quality -> customer_sat 0.146 0.142 0.070
drivers_quality -> life_sat 0.041 0.041 0.022
empathy -> customer_sat 0.310 0.313 0.068
empathy -> life_sat 0.086 0.090 0.024
env_perf -> customer_sat 0.237 0.238 0.051
env_perf -> life_sat 0.066 0.069 0.020
customer_sat -> life_sat 0.278 0.289 0.051
5% CI 95% CI
tangible -> customer_sat 0.082 0.284
tangible -> life_sat 0.020 0.090
drivers_quality -> customer_sat 0.024 0.258
drivers_quality -> life_sat 0.007 0.080
empathy -> customer_sat 0.200 0.424
empathy -> life_sat 0.053 0.132
env_perf -> customer_sat 0.152 0.320
env_perf -> life_sat 0.039 0.102
customer_sat -> life_sat 0.203 0.372
5.5 Factor loadings
# DT::datatable(summary_boot_pls_model_ebus$bootstrapped_loadings %>% round(3))
summary_boot_pls_model_ebus$bootstrapped_loadings Original Est. Bootstrap Mean Bootstrap SD T Stat.
bt1 -> tangible 0.763 0.763 0.037 20.586
bt2 -> tangible 0.766 0.765 0.035 21.705
bt5 -> tangible 0.767 0.766 0.032 23.832
bt6 -> tangible 0.790 0.788 0.030 26.288
bt7 -> tangible 0.772 0.770 0.034 22.979
bd1 -> drivers_quality 0.834 0.833 0.022 38.677
bd2 -> drivers_quality 0.823 0.821 0.025 32.829
bd3 -> drivers_quality 0.858 0.858 0.017 51.607
bd4 -> drivers_quality 0.826 0.825 0.027 30.793
emp1 -> empathy 0.768 0.766 0.029 26.148
emp2 -> empathy 0.799 0.797 0.028 28.183
emp3 -> empathy 0.699 0.697 0.046 15.222
emp4 -> empathy 0.794 0.792 0.031 25.308
emp5 -> empathy 0.762 0.763 0.028 27.095
ep1 -> env_perf 0.905 0.903 0.018 49.791
ep2 -> env_perf 0.947 0.946 0.010 98.357
ep3 -> env_perf 0.875 0.875 0.020 44.265
ep4 -> env_perf 0.866 0.865 0.028 30.751
cs1 -> customer_sat 0.944 0.944 0.012 76.924
cs2 -> customer_sat 0.960 0.960 0.006 150.747
cs3 -> customer_sat 0.934 0.933 0.015 63.827
ls1 -> life_sat 0.874 0.873 0.024 36.700
ls2 -> life_sat 0.915 0.915 0.015 59.672
ls3 -> life_sat 0.885 0.884 0.026 33.863
ls4 -> life_sat 0.854 0.851 0.024 35.463
ls5 -> life_sat 0.711 0.709 0.049 14.479
5% CI 95% CI
bt1 -> tangible 0.701 0.820
bt2 -> tangible 0.705 0.819
bt5 -> tangible 0.711 0.815
bt6 -> tangible 0.736 0.834
bt7 -> tangible 0.711 0.822
bd1 -> drivers_quality 0.797 0.866
bd2 -> drivers_quality 0.778 0.859
bd3 -> drivers_quality 0.829 0.883
bd4 -> drivers_quality 0.778 0.865
emp1 -> empathy 0.715 0.811
emp2 -> empathy 0.746 0.840
emp3 -> empathy 0.617 0.762
emp4 -> empathy 0.740 0.841
emp5 -> empathy 0.715 0.806
ep1 -> env_perf 0.869 0.928
ep2 -> env_perf 0.928 0.959
ep3 -> env_perf 0.842 0.905
ep4 -> env_perf 0.812 0.906
cs1 -> customer_sat 0.922 0.961
cs2 -> customer_sat 0.949 0.970
cs3 -> customer_sat 0.907 0.954
ls1 -> life_sat 0.830 0.908
ls2 -> life_sat 0.891 0.938
ls3 -> life_sat 0.836 0.922
ls4 -> life_sat 0.808 0.887
ls5 -> life_sat 0.618 0.782
5.6 Validity and reliability
# DT::datatable(summary_pls_model_ebus$reliability %>% round(3))
## Reliability measurment
summary_pls_model_ebus$reliability alpha rhoC AVE rhoA
tangible 0.830 0.880 0.595 0.831
drivers_quality 0.856 0.902 0.698 0.857
empathy 0.825 0.876 0.586 0.840
env_perf 0.920 0.944 0.808 0.926
customer_sat 0.941 0.962 0.895 0.944
life_sat 0.903 0.929 0.724 0.911
Alpha, rhoC, and rhoA should exceed 0.7 while AVE should exceed 0.5
5.7 Discriminant validity
## Fornell-Larcker criterion results
summary_pls_model_ebus$validity$fl_criteria tangible drivers_quality empathy env_perf customer_sat life_sat
tangible 0.772 . . . . .
drivers_quality 0.562 0.835 . . . .
empathy 0.377 0.524 0.765 . . .
env_perf 0.471 0.421 0.380 0.899 . .
customer_sat 0.489 0.509 0.544 0.500 0.946 .
life_sat 0.326 0.249 0.237 0.293 0.278 0.851
FL Criteria table reports square root of AVE on the diagonal and construct correlations on the lower triangle.
5.7.1 Heterotrait-Monotrait ratio
summary_pls_model_ebus$validity$htmt tangible drivers_quality empathy env_perf customer_sat life_sat
tangible . . . . . .
drivers_quality 0.667 . . . . .
empathy 0.440 0.606 . . . .
env_perf 0.535 0.470 0.424 . . .
customer_sat 0.551 0.565 0.596 0.532 . .
life_sat 0.378 0.279 0.262 0.320 0.300 .
5.7.2 VIF
summary_pls_model_ebus$vif_antecedentscustomer_sat :
tangible drivers_quality empathy env_perf
1.624 1.783 1.445 1.392
life_sat :
customer_sat
.